package doing.doing_001_500;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import static java.lang.Math.max;

/**
 * 121. Best Time to Buy and Sell Stock 买卖股票的最佳时机
 * <p>
 * 给定一个数组，它的第 i 个元素是一支给定股票第 i 天的价格。
 * 如果你最多只允许完成一笔交易（即买入和卖出一支股票），设计一个算法来计算你所能获取的最大利润。
 * 注意你不能在买入股票前卖出股票。
 * <p>
 * 示例 1:
 * 输入: [7,1,5,3,6,4]
 * 输出: 5
 * 解释: 在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，最大利润 = 6-1 = 5 。
 * 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
 * <p>
 * 示例 2:
 * 输入: [7,6,4,3,1]
 * 输出: 0
 * 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
 */
@Slf4j
public class BestTimeToBuyAndSellStock {

    @SuppressWarnings("all")
    public int maxProfit(int[] prices) {
        int n = prices.length;
        if (n == 0)
            return 0;

        int least = prices[0];
        int pro = 0;
        int res = 0;

        for (int i = 1; i < n; i++) {
            if (prices[i] < least) {
                least = prices[i];
            }

            if (prices[i] > least) {
                pro = prices[i] - least;
                res = max(pro, res);
            }
        }
        return res;
    }

    @Test
    public void test() {
        int[] prices = new int[]{7, 1, 5, 3, 6, 4};
        log.info("result:{}", maxProfit(prices));
    }
}






























/*
public int maxProfit(int[] prices) {
    int n = prices.length;
    if(n == 0)
        return 0;

    int least = prices[0];
    int pro = 0;
    int res = 0;

    for (int i = 1; i < n; i++) {
        if (prices[i] < least) {
            least = prices[i];
        }

        if (prices[i] > least) {
            pro = prices[i] - least;
            res = max(pro,res);
        }
    }
    return res;
}
*/
